From f1ba06c0f4142bee79a46698f715a961c6ed5128 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Tue, 1 Jul 2008 11:41:43 +0100 Subject: [PATCH] VT-d: Fix queue invalidation Correct invalidate_sync(), and clean up qinval_setup(). Signed-off-by: Weidong Han --- xen/drivers/passthrough/vtd/qinval.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/xen/drivers/passthrough/vtd/qinval.c b/xen/drivers/passthrough/vtd/qinval.c index 99bf5190c1..555beb32a9 100644 --- a/xen/drivers/passthrough/vtd/qinval.c +++ b/xen/drivers/passthrough/vtd/qinval.c @@ -222,7 +222,7 @@ int invalidate_sync(struct iommu *iommu) int ret = -1; struct qi_ctrl *qi_ctrl = iommu_qi_ctrl(iommu); - if ( qi_ctrl->qinval_maddr == 0 ) + if ( qi_ctrl->qinval_maddr != 0 ) { ret = queue_invalidate_wait(iommu, 0, 1, 1, 1, &qi_ctrl->qinval_poll_status); @@ -416,7 +416,6 @@ static int flush_iotlb_qi( int qinval_setup(struct iommu *iommu) { s_time_t start_time; - u32 status = 0; struct qi_ctrl *qi_ctrl; struct iommu_flush *flush; @@ -450,15 +449,12 @@ int qinval_setup(struct iommu *iommu) /* Make sure hardware complete it */ start_time = NOW(); - for ( ; ; ) + while ( !(dmar_readl(iommu->reg, DMAR_GSTS_REG) & DMA_GSTS_QIES) ) { - status = dmar_readl(iommu->reg, DMAR_GSTS_REG); - if ( status & DMA_GSTS_QIES ) - break; if ( NOW() > (start_time + DMAR_OPERATION_TIMEOUT) ) panic("Cannot set QIE field for queue invalidation\n"); cpu_relax(); } - status = 0; - return status; + + return 0; } -- 2.30.2